<?php

defined('EN_CODE') or die(__FILE__.': Direct Access Denied');
define('BUNDLE', 'productos');

// instanciar el paginador con la cantidad de items por pagina
use Code\Paginador;
$paginador = new Paginador(25);
// traer el modelo del modulo
$helper->include_model('productos');

// titulo y slug de la pagina
$title = 'Productos';
$slug = 'productos';

$listado = false;
if (isset($parameters[2])) switch ($parameters[2]) {
  /**
    
    detalle

  */
  case 'detalle':
    if (!$request->query->has('producto')) {
      $content = $helper->include_template('error/server_error', array('message'=>'No se seleccionó ningún producto'));
      $response->setStatusCode(412);
      break(1);
    }
    $producto = un_producto($request->query->get('producto'));
    if (!$producto) {
      $content = $helper->include_template('error/server_error', array('message'=>'El producto seleccionado no existe'));
      $response->setStatusCode(412);
      break(1);
    }
    $content .= $helper->include_template(BUNDLE.'/detalle', array('producto'=>$producto));
    break;

  case 'nuevo':
    /**
     
      nuevo

    */
    $helper->include_model('marcas');
    $helper->include_model('tipos');
    $tipos = listado_total_tipos();
    $marcas = listado_total_marcas();
    if (is_null($tipos) || is_null($marcas)) {
      $content = $helper->include_template('error/server_error', array('message'=>'Para cargar un producto se requiere que haya Marcas y Tipos'));
      $response->setStatusCode(412);
      break(1);
    }
    $content .= $helper->include_template(BUNDLE.'/formulario', array('action'=>'new', 'key'=>SHA1('new'.CSRF_TOKEN), 'marcas'=>$marcas, 'tipos'=>$tipos, 'user_agent'=>$request->headers->get('user-agent')));
    break;

    /**
      
      procesar formulario

    */
  case 'guardar':
    $action = ($request->request->get('action'));
    $key = ($request->request->get('key'));
    $guardar = false;
    $eliminar_producto = false;
    if (is_null($action) || is_null($key)) {
      $listado = true;
      break(1);
    }
    if ($request->request->get('key')!=(SHA1($request->request->get('action').CSRF_TOKEN))) {
      $content = $helper->include_template('error/server_error', array('message'=>'Se detectó un ataque CSRF!! Dejá de joder y leete un libro...'));
      break(2);
    }
    /**
      si viene nuevo
    */
    if ($action=='new') {
      $producto = un_producto_con(array(
        'codigo'=>$request->request->get('codigo'),
        'nombre'=>$request->request->get('nombre')));
      if ($producto) {
        $message = 'Ya existe un producto con ese código o nombre!!';
        $message_type = 'error';
        $listado = true;
        break(1);
      } else {
        $guardar = true;
      }
    /**
      si viene de editar
    */
    } else if ($action=='edit') {
      $producto = un_producto($request->request->get('id_producto'));
      if (!$producto) {
        $message = 'El producto que intenta editar no existe!!';
        $message_type = 'error';
        $listado = true;
        break(1);
      }
      $otro_producto = un_producto_con(array(
        'codigo'=>$request->request->get('codigo'),
        'nombre'=>$request->request->get('nombre')));
      if ($otro_producto && $otro_producto['id_producto']!=$request->request->get('id_producto')) {
        $message = 'Ya existe un producto con ese código o nombre!!';
        $message_type = 'error';
      } else if (($producto['codigo']!=$request->request->get('codigo'))
          || $producto['nombre']!=$request->request->get('nombre')
          || $producto['id_marca']!=$request->request->get('id_marca')
          || $producto['id_tipo']!=$request->request->get('id_tipo')
          || $producto['precio']!=$request->request->get('precio')
          || $producto['stock_minimo']!=$request->request->get('stock_minimo')
          || $producto['descripcion']!=$request->request->get('descripcion')) {
        $guardar = true;
        $eliminar_producto = true;
      }
    }
    /**
      tiene que guardar los cambios (validacion)
    */
    if ($guardar) {
      // valida el codigo
      $codigo = trim($request->request->get('codigo'));
      if (empty($codigo)) {
        $message = 'Envió un código vacío';
        $message_type = 'error';
        $listado = true;
        break(2);
      }
      // valida el nombre
      $nombre = trim($request->request->get('nombre'));
      if (empty($nombre)) {
        $message = 'Envió un nombre vacío';
        $message_type = 'error';
        $listado = true;
        break(2);
      }
      // valida el precio
      if (!preg_match('/^\d+(\.\d{1,2})?$/', $request->request->get('precio'))) {
        $message = 'Envió un precio que no cumple con los requerimientos';
        $message_type = 'error';
        $listado = true;
        break(2);
      }
      // valida el stock minimo
      if (!preg_match('/^\d+$/', $request->request->get('stock_minimo'))) {
        $message = 'Envió un stock minimo que no cumple con los requerimientos';
        $message_type = 'error';
        $listado = true;
        break(2);
      }
      // maneja la imagen
      if ($request->files->get('imagen')!=null) {
        $imagen = $helper->upload_file(BUNDLE, $request->files->get('imagen'));
      } else {
        if ($action=='new') {
          $imagen = '';
        } else if ($action=='edit') {
          if ($request->request->has('eliminar_imagen')) { // $_POST['eliminar_imagen']
            $imagen = '';
          } else {
            $imagen = $producto['imagen'];
          }
        }
      }
      /**
        guarda el nuevo producto
      */
      $id_producto = crear_producto(array('codigo'       => $codigo,
                                          'nombre'       => $nombre,
                                          'id_marca'     => $request->request->get('id_marca'),
                                          'id_tipo'      => $request->request->get('id_tipo'),
                                          'imagen'       => $imagen,
                                          'precio'       => $request->request->get('precio'),
                                          'stock_minimo' => $request->request->get('stock_minimo'),
                                          'descripcion'  => $request->request->get('descripcion'),
                                          'estado'       => '1' ));
      if (!$id_producto) {
        $message = 'Se produjo un error al guardar el producto';
        $message_type = 'error';
      } else {
        if ($eliminar_producto) {
          estado_producto($producto['id_producto'], 0);
        }
        $message = 'Se guardaron los cambios correctamente';
        $message_type = 'info';
        $producto = un_producto($id_producto);
      }
    }
    // break; <-- continúa la ejecución; carga el formulario

    /**
      
      editar

    */
  case 'editar':
    if ((!$request->query->has('producto')) && (!isset($producto))) {
      $content = $helper->include_template('error/server_error', array('message'=>'No se seleccionó ningún producto'));
      $response->setStatusCode(412);
      break(1);
    }
    if ($request->query->has('producto')) {
      $producto = un_producto($request->query->get('producto'));
    }
    if (!$producto) {
      $content = $helper->include_template('error/server_error', array('message'=>'El producto seleccionado no existe'));
      $response->setStatusCode(412);
      break(1);
    }
    $helper->include_model('marcas');
    $helper->include_model('tipos');
    $tipos = listado_total_tipos();
    $marcas = listado_total_marcas();
    $content .= $helper->include_template(BUNDLE.'/formulario', array('producto'=>$producto, 'action'=>'edit', 'key'=>SHA1('edit'.CSRF_TOKEN), 'marcas'=>$marcas, 'tipos'=>$tipos, 'user_agent'=>$request->headers->get('user-agent')));
    break;

    /**

      eliminar

    */
  case 'eliminar':
    if (!$request->query->has('producto')) {
      $content = $helper->include_template('error/server_error', array('message'=>'No se seleccionó ningún producto'));
      $response->setStatusCode(412);
    } else  if ((!$request->query->has('token')) || ($request->query->get('token')!=(SHA1($request->query->get('producto').CSRF_TOKEN)))) {
      $content = $helper->include_template('error/server_error', array('message'=>'Se detectó un ataque CSRF!! Dejá de joder y leete un libro...'));
    } else {
      $producto = un_producto($request->query->get('producto'));
      if ($producto) {
        estado_producto($producto['id_producto'], 0);
        $message = "Se eliminó el producto";
        $message_type = 'info';
        $listado = true;
      }
    }
    break;

    /**

      buscar

    */
  case 'buscar':
    $filtros = array(); // para determinar los filtros que se van a aplicar en la consulta
    /**
      codigo
    */
    $query_codigo = '';
    if ($request->query->has('codigo')) {
      $codigo = trim($request->query->get('codigo'));
      if ($codigo!='') {
        $query_codigo = " AND codigo LIKE '%". $request->query->get('codigo') ."%' ";
        $filtros['código similar a '] = $request->query->get('codigo');
      }
    }
    /**
      nombre
    */
    $query_nombre = '';
    if ($request->query->has('nombre')) {
      $nombre = trim($request->query->get('nombre'));
      if ($nombre!='') {
        $query_nombre = " AND nombre LIKE '%". $request->query->get('nombre') ."%' ";
        $filtros['nombre similar a '] = $request->query->get('nombre');
      }
    }
    /**
      marca
    */
    $query_marca = '';
    if ($request->query->has('id_marca')) {
      $marca = trim($request->query->get('id_marca'));
      if ($marca!='') {
        $query_marca = " AND id_marca=". $request->query->get('id_marca') ." ";
        $helper->include_model('marcas');
        $una_marca = una_marca($request->query->get('id_marca'));
        $filtros['marca '] = $una_marca['nombre'];
      }
    }
    /**
      tipo
    */
    $query_tipo = '';
    if ($request->query->has('id_tipo')) {
      $tipo = trim($request->query->get('id_tipo'));
      if ($tipo!='') {
        $query_tipo = " AND id_tipo=". $request->query->get('id_tipo') ." ";
        $helper->include_model('tipos');
        $un_tipo = un_tipo($request->query->get('id_tipo'));
        $filtros['tipo '] = $un_tipo['nombre'];
      }
    }
    /**
      precio
    */
    $query_precio = '';
    if ($request->query->has('precio')) {
      if (preg_match('/^\d+(\.\d{1,2})?$/', $request->query->get('precio'))) {
        $query_precio = " AND precio=". $request->query->get('precio')." ";
        $filtros['precio='] = $request->query->get('precio');
      }
    }
    /**
      stock_minimo
    */
    $query_stock_minimo = '';
    if ($request->query->has('stock_minimo')) {
      if (preg_match('/^\d+$/', $request->query->get('stock_minimo'))) {
        $query_stock_minimo = " AND stock_minimo=". $request->query->get('stock_minimo') ." ";
        $filtros['stock mínimo='] = $request->query->get('stock_minimo');
      }
    }
    /**
      armar la consulta y traer el listado
    */
    $listado = true;
    // se fija el orden
    $order_by = '';
    if ($request->query->has('orden_c')) {
      $order_by = " ORDER BY ". $request->query->get('orden_c') ." ";
      if ($request->query->has('orden_t')) {
        $order_by .= " ". $request->query->get('orden_t') ." ";
      }
    }
    $query = "SELECT * FROM productos WHERE estado=1 $query_codigo $query_nombre $query_marca $query_tipo $query_precio $query_stock_minimo $order_by";
    $query = $paginador->query($query, $request->query->get('pagina', 1  ));
    $result = $model->query($query);
    if (!$result || $model->numRows($result)==0) {
      $message = 'La búsqueda no produjo ningún resultado';
      $message_type = 'error';
    } else {
      $filtrado = "Filtrando por ";
      $i = 0; // para saber si separa con coma
      foreach ($filtros as $filtro => $valor) {
        $filtrado .= "$filtro'$valor'";
        $filtrado .= ((++$i==count($filtros)) ?'': ", " );
      }
      $listado_productos = $model->fetchAll($result);
    }
    break;

  default:
    $listado = true;
} else {
  $listado = true;
}

/**
  
  listado

*/

// listado esta aca por ser la pagina por default
if ($listado) {

  // va a buscar el listado de productos
  if (!isset($listado_productos)) {
    // se fija el orden
    $order_by = '';
    if ($request->query->has('orden_c')) {
      $order_by = " ORDER BY ". $request->query->get('orden_c') ." ";
      if ($request->query->has('orden_t')) {
        $order_by .= " ". $request->query->get('orden_t') ." ";
      }
    }
    $query = "SELECT * FROM productos WHERE estado=1 $order_by";
    $query = $paginador->query($query, $request->query->get('pagina', 1  ));
    $result = $model->query($query);
    $listado_productos = $model->fetchAll($result);
  }

  // va a buscar las marcas y tipos
  $helper->include_model('marcas');
  $helper->include_model('tipos');
  $tipos = listado_total_tipos();
  $marcas = listado_total_marcas();

  // arma el array orden_t (asc o desc)
  $orden_t = $helper->get_order_links(array('nombre', 'codigo', 'descripcion'), $request->query->get('orden_c', null), $request->query->get('orden_t', null));
  // arma la URI para el paginador
  $uri_paginador = $helper->build_uri(array('pagina'));
  // arma la URI para el orden
  $uri_orden = $helper->build_uri(array('orden_c', 'orden_t'));

  // muestra el template
  $content .= $helper->include_template(BUNDLE.'/listado',
                                        array(
                                          'productos'=>$listado_productos,
                                          'uri_orden'=>$uri_orden,
                                          'orden_t' => $orden_t,
                                          'uri_paginador'=>$uri_paginador,
                                          'paginador'=>$paginador,
                                          'marcas'=>$marcas,
                                          'tipos'=>$tipos,
                                          'filtrado'=>(isset($filtrado) ? $filtrado : ''),
                                          'user_agent'=>$request->headers->get('user-agent')));
}

?>
